package test;

//Create a curve that passes thru N randomly selected points.
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
import java.util.Random;

public class Curve extends Applet {
	Image img;
	int w, h, x, y, pix[], red, green, blue, alpha;
	Random rng = new Random();

	int n = rng.nextInt(10) + 5; // n random points
	int[] arx = new int[n];
	int[] ary = new int[n];

	public void init() {
		w = getSize().width;
		h = getSize().height;
		alpha = 255;
		pix = new int[w * h];
		img = createImage(new MemoryImageSource(w, h, pix, 0, w));

		// n random points
		for (int i = 0; i < n; i++) {
			arx[i] = rng.nextInt(w);
			ary[i] = rng.nextInt(h);
		}

		double wgh;
		int y;
		double sum;
		double sumw;
		boolean flag;

		for (x = 0; x < w; x++) {
			flag = false;
			sum = 0.0;
			sumw = 0.0;
			y = 0;
			for (int i = 0; i < n; i++) {
				if (x != arx[i]) {
					// wgh=1.0/Math.pow(Math.abs((double)(x-arx[i])),1.0); //
					// linear
					wgh = 1.0 / Math.pow(Math.abs((double) (x - arx[i])), 2.0); // quadratic
					// wgh=1.0/Math.pow(Math.abs((double)(x-arx[i])),3.0); //
					// cubic
					sumw += wgh;
					sum += (ary[i] * wgh);
				} else {
					flag = true;
					y = ary[i];
					break;
				}
			}
			if (flag == false) {
				y = (int) (sum / sumw);
			}

			red = 36;
			green = 76;
			blue = 16;
			pix[w * y + x] = (alpha << 24) | (red << 16) | (green << 8) | blue;

		}

		img = createImage(new MemoryImageSource(w, h, pix, 0, w));
	}

	public void paint(Graphics g) {
		g.drawImage(img, 0, 0, this);

		// show the n points on the curve
		for (int i = 0; i < n; i++) {
			g.drawOval(arx[i] - 5, ary[i] - 5, 10, 10);
		}

		long ctm = System.currentTimeMillis();
		while ((System.currentTimeMillis() - ctm) < 3000) {
			;
		}
		init();
	}
}
